【问题标题】:Python: How do I fix my code so that the append will add the argument to the list?Python:如何修复我的代码,以便追加将参数添加到列表中?
【发布时间】:2019-11-22 17:28:07
【问题描述】:

我对 python 很陌生,我一直在尝试执行此代码,我使用 tkinter 按钮命令来运行一个函数,它可以工作但 append() 没有执行,这意味着它不会附加到列表中.

列表和包含追加的函数在类之外,然后通过使用 tkinter 按钮命令归类在类中

我已经尝试将函数放入类中,它可以工作,但追加不会再次添加到列表中。

这是我编写的与真实代码有些相似的代码

prices = []

f = True
class firstclass():
    def __init__(self):
        while f == True:
            my_function()
            f = False

def my_function():
    prices.append(70)


class secondclass():

    def __init__(self):
        pass

    print(sum(prices))

实际代码示例在此链接中,请同时考虑这一点 python: Appending a value to a list outside the class, function with append also outside the class, but function is called within a class

我预计它会打印附加值 70,但它仍然打印 0

【问题讨论】:

    标签: python python-3.x list append


    【解决方案1】:

    您需要处理的一些问题。首先在类外部分配f=True 不会改变内部的值,所以如果你实例化类它只会抛出一个UnboundLocalError 抱怨f 没有初始化。您可以通过实例化类来自己尝试

    fc = firstclass()
    

    没有实例化,你就没有希望它给你想要的价值。它打印零是因为函数 secondclass 具有不包含在方法中的打印语句,因此它打印声明类的值 sum(prices)。该值来自价格的原始声明值[]。至少这是您在问题中展示的方式。我不确定您是否打算缩进打印语句,这意味着它是二等的一部分。但是,如果你不缩进,你会得到与没有实例化 firstclass 相同的结果。

    要更正此问题,请参见下文。此代码将按照您的预期输出 70。

    prices = []
    
    class firstclass():
        def __init__(self):
            my_function()
    
    def my_function():
        prices.append(70)
    
    class secondclass():
        def __init__(self):
            pass
    
    print('before instantiation', sum(prices))
    fc = firstclass()
    print('after instantiation', sum(prices))
    

    fc 现在是 firstclass 类型的对象,__init__ 方法已调用 my_function 将值 70 附加到 prices

    【讨论】:

    • 我在我的真实代码中使用 tkinter,我想使用 tk.Label 打印总和(价格)并将其放在 class secondclass()def __init__(self, parent, controller) 中。有没有办法让它在二等舱的def __init__(self, parent, controller) 内?
    【解决方案2】:

    发生这种情况有两个原因。

    1. 您从未调用过firstclass 来实际初始化 构造函数。
    2. 您正在尝试将False 分配给变量f 不属于类的范围。如果你仍然分配 它,它被认为是本地的。而此刻的口译员 检测到你分配了它,while循环没有任何本地 f 的引用,因为您没有在构造函数下定义它。 更多详情请参阅this 答案。

    这是完整的代码:

    prices = []
    class firstclass():
        f = True
        def __init__(self):
            while self.f:
                my_function()
                self.f = False
    def my_function():
      prices.append(70)
    
    
    class secondclass():
        def __init__(self):
            pass
    
    firstclass()
    print(sum(prices))
    

    【讨论】:

    • 嗨!我实际上在我的真实代码中使用 tkinter,while 语句只是 tk.Button(self, command=my_function) 的替代品,而 print 是 tk.Label(self, text=sum(prices)) 的替代品。按钮在第一类,而标签在第二类。有没有办法让价格在二等舱的__init__ 范围内?或者如果有任何其他方式可以产生与我预期的结果相同的结果并在 tkinter 框架中显示它,我也很感激知道如何做到这一点。 :)
    • 抱歉,我现在对 tkinter 还不是很熟悉,但是你绝对可以在第二类的 __init__ 方法中调用 firstclass()print(sum(prices)。之后,您可以在全局范围内调用secondclass(),您将获得相同的结果。
    • 我只是尝试这样做,但它给我发送了错误 TypeError: __init__() missing 2 required positional arguments: 'parent' and 'controller' 我猜这是因为__init__ in the firstclass( ) 在实际代码中有 `def __init__(self, parent, controller):` 你能建议我可以做什么,这样我就不需要放置位置参数了吗?
    • 当我全局调用 secondclass() 时也会发生同样的情况,因为它再次具有这 3 个位置参数
    猜你喜欢
    • 2019-09-12
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2013-11-08
    • 2019-04-07
    • 2020-08-04
    相关资源
    最近更新 更多