为什么我可以访问列表类型的 class 变量并更改其内容,但不能访问字符串类型的变量?
Why am I able to access the class variable of type list and change its contents but not of type string?
我有以下代码:
class Employee:
orgName = 'Credit Cards' # class variable
def __init__(self, name):
self.name = name # instance variable
Sam = Employee('Sam')
print(Sam.orgName) # 'Credit Cards'
Sam.orgName = 'Loans'
print(Sam.orgName) # 'Loans'
print(Employee.orgName) # 'Credit Cards'
所以在上面的例子中我明白当我分配一些东西给 Sam.orgName 时。 Python 实际上是在创建一个名为 'orgName' 的实例变量,因此 class 变量 'orgName' 保持不变。
但后来我尝试了下面的代码,这里是我感到困惑的地方:
class Employee:
orgName = 'Credit Cards' # class variable
hobbies = ['Hiking']
def __init__(self, name):
self.name = name # instance variable
Sam = Employee('Sam')
print(Sam.hobbies) # 'Hiking'
Sam.hobbies.append('Reading')
print(Sam.hobbies) # 'Hiking', 'Reading'
print(Employee.hobbies) # 'Hiking', 'Reading'
当 class 变量应该遵循第一个代码片段的行为时,我怎么能够在这里修改 class 变量,其中 Sam.hobbies 应该创建一个列表实例变量?
修改字符串成员和列表成员的方式不同。最初 Employee
静态成员由实例 Sam
共享(当 Sam
启动时,它引用任何 Employee
引用)。
在列表的情况下,您修改了此列表 in-place,这改变了两者的列表,因为它们指向同一个对象。在字符串的情况下,您更改了 Sam
变量的 assignment,因此此实例的 orgName
版本不再指向与Employee
class 确实如此。请注意,字符串在 python 中是不可变的,因此无论如何您都无法以相同的方式进行 in-place 修改。
我有以下代码:
class Employee:
orgName = 'Credit Cards' # class variable
def __init__(self, name):
self.name = name # instance variable
Sam = Employee('Sam')
print(Sam.orgName) # 'Credit Cards'
Sam.orgName = 'Loans'
print(Sam.orgName) # 'Loans'
print(Employee.orgName) # 'Credit Cards'
所以在上面的例子中我明白当我分配一些东西给 Sam.orgName 时。 Python 实际上是在创建一个名为 'orgName' 的实例变量,因此 class 变量 'orgName' 保持不变。
但后来我尝试了下面的代码,这里是我感到困惑的地方:
class Employee:
orgName = 'Credit Cards' # class variable
hobbies = ['Hiking']
def __init__(self, name):
self.name = name # instance variable
Sam = Employee('Sam')
print(Sam.hobbies) # 'Hiking'
Sam.hobbies.append('Reading')
print(Sam.hobbies) # 'Hiking', 'Reading'
print(Employee.hobbies) # 'Hiking', 'Reading'
当 class 变量应该遵循第一个代码片段的行为时,我怎么能够在这里修改 class 变量,其中 Sam.hobbies 应该创建一个列表实例变量?
修改字符串成员和列表成员的方式不同。最初 Employee
静态成员由实例 Sam
共享(当 Sam
启动时,它引用任何 Employee
引用)。
在列表的情况下,您修改了此列表 in-place,这改变了两者的列表,因为它们指向同一个对象。在字符串的情况下,您更改了 Sam
变量的 assignment,因此此实例的 orgName
版本不再指向与Employee
class 确实如此。请注意,字符串在 python 中是不可变的,因此无论如何您都无法以相同的方式进行 in-place 修改。