【问题标题】:List of objects is not iterable & call variable being in other function对象列表不可迭代 & 调用变量在其他函数中
【发布时间】: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(或尝试)。
  • 谢谢你,两位炼金术士。我已经添加了我的程序的完整代码。

标签: python oop


【解决方案1】:

您的问题出在draw 方法中:

for card in deal.player_hand:
    ...

您正在迭代 player_hand,它是 Hand 类的一个对象,而不是该手牌中的牌。你可能想做for card in deal.player_hand.hand_list

【讨论】:

  • 您能回答第一个问题吗?
  • 不是真的,因为我根本不懂。为什么你每秒调用这个函数 60 次,为什么这意味着你不能调用另一个函数?
  • 我正在尝试制作一种“Lite”二十一点,因此它需要图形界面。我正在使用 simplegui 模块,其中一个想法是:应用程序每 1/60 秒绘制一次。
  • 但是为什么每 60 秒就会召唤一只新手呢?当然,您只需要在按下按钮时调用该函数。
  • 我需要在棋盘上有 4 到 5 张牌(取决于游戏状态)。通过调用draw函数绘制棋盘上的每张牌。Draw函数是每秒调用60次的函数。如果我将卡片作为 my_hand_function 的输出传递,则 my_hand_function 将每秒调用 60 次。因此总会有新卡。我清楚了吗?还是你告诉我我做的方式不太好?
猜你喜欢
  • 2013-08-03
  • 2015-07-09
  • 2020-10-15
  • 2019-12-03
  • 2014-04-26
  • 1970-01-01
  • 2015-08-02
  • 2015-09-29
  • 2023-03-31
相关资源
最近更新 更多