【问题标题】:Assigning Complex (Mutable) Variables in python by Value [duplicate]按值在python中分配复杂(可变)变量[重复]
【发布时间】:2021-09-04 16:55:18
【问题描述】:

python 中的变量在实际使用中是有效的指针。赋值运算符“=”会自动创建一个有效指针——除非它是基本类型(称为不可变)。基本数据类型的示例包括:intfloatstrbool。这些数据类型的赋值不使用指针。

另一方面,指针在分配时使用listsdictsclass 对象等。

当我需要按值分配后一种类型的变量(例如列表)时,这令人沮丧。

例如:

background = [1, 1, 0, 2, 2]
screen = background

background[2] = 8

print(background)  # [1, 1, 8, 2, 2]
print(screen)      # [1, 1, 8, 2, 2]

# However, I did NOT want screen to change

这个可以吗?

【问题讨论】:

标签: python variables variable-assignment


【解决方案1】:

还有其他按值分配的方法。例如,您可以使用列表推导:

screen = [i for i in background]

这将创建一个 变量,其中包含 background 的值。

有多种方法可以完成这种分配。另一种是使用列表解包:

screen = [*background]

这将从原始对象中解压缩变量并将它们放入一个新列表中。

另一种方法是按照其他答案中的建议使用copy

【讨论】:

    【解决方案2】:

    当然,您只需要复制一份。 copy 模块提供浅拷贝和深拷贝。

    import copy
    
    ...
    
    screen = copy.copy(background)
    

    浅拷贝(如上)只拷贝最外层的数据结构。在您的情况下,这就足够了,因为列表的所有元素都是不可变的值。如果您有嵌套列表或更复杂的数据结构,您可以使用copy.deepcopy 复制整个结构。谨慎使用后者,因为结构中的任何循环都会导致无限递归。

    此外,特别是对于列表,我们可以使用 Python 的切片语法更轻松地进行浅拷贝。

    screen = background[:]
    

    a:b 切片语法选择列表的子列表并始终复制。省略开始索引默认为 0,省略结束索引默认为列表末尾,因此省略两者都会复制整个列表。

    【讨论】:

      猜你喜欢
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多