首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在Python中使用global而不让编程新手感到困惑?

避免在Python中使用global而不让编程新手感到困惑?
EN

Stack Overflow用户
提问于 2013-07-21 02:51:41
回答 2查看 3.2K关注 0票数 12

我教8-9年级学生基本的计算机编程已经有两个星期了,昨天我试着向他们展示如何用Python制作真正简单的文本冒险游戏。

场景是函数(例如dragons_cave()),它由一些打印语句组成,然后调用input(),询问玩家下一步要去哪里,然后将其传递给globals()以找到适当的函数,然后调用。我知道这并不理想(在什么情况下,庞大的函数链会开始成为问题?)但是,在我脑海中闪过的东西中,对他们来说似乎是最简单的,只需要一点挥手。

我的问题是全球状态- ex。玩家在一个场景中得到一把钥匙,然后他们才能在另一个场景中打开大门。当我有像字符串或布尔值这样的全局不可变变量时,Python希望我在函数的开头使用global关键字。

代码语言:javascript
复制
global hasKey
hasKey = True

我对此相当满意,但我有一种模糊的感觉(从Stackoverflow和互联网上的其他地方学到的),global是不受欢迎的,而且总是有一个更好的对手。我可以有一本全局字典,或者把所有东西都包装在一个类中,但我不确定我是否能向我的孩子们清楚地捍卫这些选项(他们仍在思考变量的含义)。

无论我使用什么,我都希望能够直接地向我的孩子们解释为什么我们这样做,为什么这样做是必要的。global似乎同时拥有这两个属性,但它是不是很糟糕呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-21 03:00:05

我会鼓励他们开始学习面向对象

代码语言:javascript
复制
class Location:
     name="a place"
     description = "A dark place.  there are exits to the North and East"
     exits = "North","East"
     def __str__(self):
         return "%s\n%s"%(self.name,self.description)


class Player:
     current_location = "Home"
     inventory = ["Blue Key","Magic Thumbtacks"]
     health = 100
     name = "Unknown"
     def __init__(self,name):
         self.name = name

player = Player("Player 1")
loc = Location()
print loc
x = input("Input:")

老实说,游戏是一个很难的概念(甚至是文本冒险)。但我会直接从面向对象的概念开始,从长远来看,他们将从中受益更多。

诚然,这个示例非常小,并且省略了很多实现细节。

一个不相关但更好的OO示例是:

代码语言:javascript
复制
class Animal:
     voice = '...'
     def speak(self):
         return "A %s Says '%s'"%(self.__class__.__name__, self.voice)

class Dog(Animal):
     voice = "Bark, Bark"

class Duck(Animal):
     voice = "Quack, Quack"

print Dog().speak()
print Duck().speak()
票数 10
EN

Stack Overflow用户

发布于 2013-07-21 03:27:34

假设您希望使事情尽可能简单(没有OO),并希望避免引入global关键字,那么您可以使用状态字典并在其中分配变量。

代码语言:javascript
复制
state['hasKey'] = True

由于对此dict的访问不是一个变量赋值,因此您可以避免引入global关键字,同时还可以教您如何使用dict (检查键等)。

当然,您仍然使用全局变量,并没有真正解决良好的编码风格的问题。但另一方面,它可以作为对作用域和名称空间的介绍。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17765560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档