【发布时间】:2014-07-09 15:44:56
【问题描述】:
我看过这篇文章,但仍然无法弄清楚我的问题。 Python iteration of list of objects "not iterable" 我的问题还有第二部分: 如何使用在另一个函数中创建的变量。 我将从它开始。我在 SO 中搜索或罚款的答案:
1 个变体 - 全局变量
def func1():
global value2,value1
value1 = 1
value2 = 2
def func2():
global value2,value1
do smth with value1
do smth with value2
func1()
func2()
但由于某种原因,这是个坏主意。我没有得到太多,就像我使用相同的命名空间,并限制命名变量的变体。而且一些不可预知的行为更容易得到..(这是我的理解)
2 变体 - 函数是对象,Python 中的一切都是对象!
def func1():
func1.value1 = 1
func1.value2 = 2
def func2():
do smth with func1.value1
do smth with func1.value2
func1()
func2()
这是一个更好的主意?
3 变体 - 使用返回
我知道每个人都说:试着让你的函数返回一些你会进一步使用的值。但!我有一个函数 draw() 每秒重新运行 60 次,这就是为什么这样写是一团糟:
def draw():
variable = some_function()
我的功能将每秒启动 60 次,我只需要 1 次就可以按下特定的触发器/按钮。
最后是我的主要问题 这是我的代码:
class Card:
def __init__(self, suit, rank):
...
def draw(self, canvas, pos):
...
class Hand:
def __init__(self):
self.hand_list = []
def draw(self, canvas, pos):
...
deff add_card(self)
def deal():
test_hand = Deck() # from the Deck we fulfill cards to player and computer hands
test_hand.shuffle()
deal.player_hand, computer_hand = Hand(), Hand()
def draw(canvas):
i = 0
for card in deal.player_hand:
deal.player_hand.draw(canvas, [300, 300])
最后我明白了。
TypeError: 'Hand' 对象不可迭代
self.hand_list 的某个类型从列表更改为非列表。或者问题在更深的地方。因为当我查看解释器正在打印的内容时 - 他正在打印 2 张某种花色的卡片并排名为 1 个对象。我不知道从哪里开始。 我会非常有帮助的建议。
我有 Mark Lutz 的 Learning Python,也许有一些主题 应该深入研究一下吗?
谢谢大家!
这是我的代码的链接。你可以从那里运行它。 http://www.codeskulptor.org/#user35_zXdT3D8RpqJXoVb.py
【问题讨论】:
-
能否请您提供一个我们可以运行并查看为我们自己生成的错误的工作代码示例?
-
"self.hand_list 的某个类型从列表更改为非列表。"不是根据你的错误,上面写着
TypeError: 'Hand' object is not iterable。据此,您不是在迭代self.hand_list- 您是在迭代self(或尝试)。 -
谢谢你,两位炼金术士。我已经添加了我的程序的完整代码。