为什么这会打印错误的东西?

Why does this print the wrong thing?

为什么打印“所以一定是:测试测试”而不是“所以一定是:你好,是我”

class bob():
    subjectTemp='test'
    levelTemp='test'
    def setSubject(function_subject):
        bob.subjectTemp=function_subject
        print(bob.subjectTemp)
    def setLevel(function_level):
        bob.levelTemp=function_level
        print(bob.levelTemp)
    def join(subject=subjectTemp, level=levelTemp):
        print("So it must be:", subject, level)



bob.setSubject("hello")
bob.setLevel("it's me")
bob.join()

默认值在函数定义时计算一次。这是新 Python 支持者在使用可变参数(例如列表)时偶然发现的一个经典问题 — 但这是同一陷阱的另一个实例。

您可以在 official documentation 中阅读有关默认参数的更多信息。

特别是:“重要警告:默认值仅计算一次”。

编辑:这是对您所问内容的技术解释,但请在此处阅读其他人的评论和答案。这是使用 Python 类 的一种特殊方式,它可能会绊倒你的腿。请 google 'Pythonic code' 和 'idiomatic code'.

直接的“问题”是这在函数定义时绑定:

def join(subject=subjectTemp, level=levelTemp):

subject的值将是函数声明时subjectTemp的值,不会改变。有关详细信息,请参阅 "Least Astonishment" and the Mutable Default Argument

更大的问题是,这根本不是您使用 类 的方式。你想要这样的东西:

class Bob():
    subject = 'test'
    level = 'test'

    def set_subject(self, subject):
        self.subject = subject
        print(self.subject)

    def set_level(self, level):
        self.level = level
        print(self.level)

    def join(self):
        print("So it must be:", self.subject, self.level)

b = Bob()
b.set_subject("hello")
b.set_level("it's me")
b.join()

subjectTemp 和 levelTemp 具有默认值。

你可以这样写:

class bob():
  subjectTemp='test'
  levelTemp='test'

  def setSubject(function_subject):
      bob.subjectTemp=function_subject
      print(bob.subjectTemp)
    
  def setLevel(function_level):
      bob.levelTemp=function_level
      print(bob.levelTemp)
    
  def join():
      print("So it must be:", bob.subjectTemp, bob.levelTemp)

bob.setSubject("hello")
bob.setLevel("it's me")
bob.join()