繁体   English   中英

为什么Python范围对于列表变量和字符串变量的行为似乎不同?

[英]Why the Python scope seems to behave differently for list variable and string variable?

假设我有以下Python代码:

import sys

class DogStr:
    tricks = ''

    def add_trick(self, trick):
        self.tricks = trick

class DogList:
    tricks = []

    def add_trick(self, trick):
        self.tricks.append(trick)

# Dealing with DogStr
d = DogStr()
e = DogStr()
d.add_trick('trick d')
e.add_trick('trick e')
print(d.tricks)
print(e.tricks)

# Dealing with DogList
d = DogList()
e = DogList()
d.add_trick('trick d')
e.add_trick('trick e')
print(d.tricks)
print(e.tricks)

使用Python 3.6.5运行此代码,我得到以下输出:

trick d
trick e
['trick d', 'trick e']
['trick d', 'trick e']

DogStr和DogList之间的区别在于我将tricks视为前者的字符串和后者的列表。

在处理DogStr时,技巧表现为实例变量。 但使用DogList技巧表现为类变量。

我期望在两个调用中看到相同的行为,即:如果输出的两个最后一行是相同的,那么应该是前两个。

所以我想知道。 对此有何解释?

区别在于对象的类型,而在于代码对它的作用。

这两者之间有很大的不同:

self.tricks = trick

和:

self.tricks.append(trick)

第一个self.tricks = trick tricksself属性tricks赋予一个值。

第二个self.tricks.append(trick)检索self.tricks并在其上调用一个方法(这里修改它的值)。


在您的情况下,问题是在self实例上没有定义任何tricks ,因此self.tricks.append获取类的tricks属性并修改它,但self.tricks = ...self上创建一个新属性。

事实上,其中一个是字符串而另一个是列表并不真正相关。 如果两者都是列表,那将是相同的。 请注意,它们不能都是字符串,因为字符串是不可变的,因此没有追加方法

怎么解决?

这是错的:

def add_trick(self, trick):
    self.tricks = trick

如果tricks是一个类属性, add_trick应该是一个类方法:

@classmethod
def add_trick(cls, trick):
    cls.tricks = trick

如果add_trick成为实例方法,那么只需执行以下操作:

def add_trick(self, trick):
    DogStr.tricks = trick

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM