4Manuals

  • PDF Cloud HOME

关于python中变量的困惑。 python如何使用变量? Download

    如何将文本边界框与pyplot.Rectangle对齐? 导入类问题 在Python数据框中选择列时出错 使用Rabbit的pika确认消息 如何在按住键的同时暂停VideoStream? Python OpenCV TypeError:无法处理此数据类型 使用buildozer不会下载sdl2_image SMTPSenderRefused,421,超出超时 Tensorflow多线程推理比单线程推理慢 当使用pyodbc时,SQL Server DateTimeOffset将可识别tz的日期时间的偏移更改为系统偏移

运行此命令时,

key=[[0, 0, 0], [1, 0, 0], [0, 1, 1]]
key_=[[0, 0, 0], [1, 0, 0], [0, 1, 1]]
m=3
for i_ in range(1,m+1):
    for j_ in range(1,m+1):
        key[j_-1][m+1-i_-1]=key_[i_-1][j_-1]
print(key,key_,sep='\n')

我明白了:

>>> [[0, 1, 0], [1, 0, 0], [1, 0, 0]]
[[0, 0, 0], [1, 0, 0], [0, 1, 1]]

但是,当我仅更改第二行时,

key=[[0, 0, 0], [1, 0, 0], [0, 1, 1]]
key_=key
m=3
for i_ in range(1,m+1):
    for j_ in range(1,m+1):
        key[j_-1][m+1-i_-1]=key_[i_-1][j_-1]
print(key,key_,sep='\n')

我明白了:

>>> [[0, 1, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]

两个代码为什么会有不同的结果? 我认为它们应该相同。 为什么不同的部分会产生不同的结果?

1 个答案:

答案 0 :(得分:0)

在Python中,包含列表的变量更像指针。当您说key_=key时,是在告诉Python在两种情况下都使用相同列表,而不是副本。如果要复制原始列表,请使用key_=[x.copy() for x in key]。这将复制key中每个项目(列表)的内容。

示例:

制作两个包含1、2和3的列表

>>> my_list = [1,2,3]
>>> my_list
[1, 2, 3]
>>> my_list2 = my_list
>>> my_list2
[1, 2, 3]

现在让我们编辑原始列表的值...

>>> my_list[0] = 10
>>> my_list
[10, 2, 3]
>>> my_list2
[10, 2, 3]

之所以复制更改,是因为my_list和my_list2是相同,而不仅仅是它们的副本。

让我们更改my_list2:

>>> my_list2[1] = 20
>>> my_list2
[10, 20, 3]
>>> my_list
[10, 20, 3]

再一次,由于它们都指向同一列表,因此在这两个值之间进行了更新。

现在让我们看看如果使用copy方法会发生什么:

>>> my_list_copy = my_list.copy()
>>> my_list_copy
[10, 20, 3]
>>> my_list[0] = 1
>>> my_list
[1, 20, 3]
>>> my_list_copy
[10, 20, 3]

因此我们可以看到两个列表以相同的内容开头,但有所不同。

使用is运算符,我们还可以看到3个列表变量之间的区别:

>>> my_list is my_list2
True
>>> my_list is my_list_copy
False
>>> 

编辑:

key是一个包含列表作为项目的列表。调用copy方法时,仅复制外部列表,因此两个列表(即子列表)中的实际项目都相同。要通过值而不是通过引用有效复制它们,我们可以使用简单的列表理解:

key_=[x.copy() for x in key]

此代码按值复制key中的每个项目,并创建一个包含这些项目的新列表。

使用此命令的输出是

[[0, 1, 0], [1, 0, 0], [1, 0, 0]]
[[0, 0, 0], [1, 0, 0], [0, 1, 1]]



Similar searches
    我正在尝试开发一个用于跟踪乘客的应用程序,以提供服务所需的代码,以便使用firbase获取乘客的位置 实现用户定义的do.call的正确功能的正确方法是什么? 如何连接laravel / php领域? 如何将左联接与两个单独的列名称合并,并仅从左表中获取列 如何使用带有自定义值类型的Go容器?