Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用列表中的切片运算符避免for循环中的副作用?_Python_List_Python 2.7_Slice - Fatal编程技术网

如何在python中使用列表中的切片运算符避免for循环中的副作用?

如何在python中使用列表中的切片运算符避免for循环中的副作用?,python,list,python-2.7,slice,Python,List,Python 2.7,Slice,这是从链接中引用的:- 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示: 输出为: ['red', 'black'] 我的问题是:语句colors[:]是否复制了颜色列表,并且for循环是否在副本而不是原始列表上工作?如果是这样,那么如何将[“balck”]附加到原始颜色列表中?colors[:]复制原始列表并对其进行迭代,但colors保留原始列表。以下代码将等效: copy = colours.copy() for i in copy: if i == "red"

这是从链接中引用的:- 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示:

输出为:

['red', 'black']

我的问题是:语句
colors[:]
是否复制了颜色列表,并且for循环是否在副本而不是原始列表上工作?如果是这样,那么如何将
[“balck”]
附加到原始颜色列表中?

colors[:]
复制原始列表并对其进行迭代,但
colors
保留原始列表。以下代码将等效:

copy = colours.copy()
for i in copy:
    if i == "red":
        colours.append("black")  # append is O(1)
    if i == "black":
        colours.append("white")

colors[:]
复制原始列表并对其进行迭代,但
colors
保留原始列表。以下代码将等效:

copy = colours.copy()
for i in copy:
    if i == "red":
        colours.append("black")  # append is O(1)
    if i == "black":
        colours.append("white")

语句
颜色[:]
是否复制了颜色列表
:是

并且for循环在副本上而不是在原始列表上工作?是的,但请注意“在上工作”的含义。变量
i
从列表
colors
的副本中获取其值。但是,
colors+=[“black”]
行中对
colors
的引用是指原始列表。这正是代码想要的,所以它是有效的


如果是这样,那么[“黑色”]是如何附加到原始颜色列表中的?这是因为附加的行是指原始列表,而不是列表的副本。

语句
颜色[:]
是否复制了颜色列表
:是

并且for循环在副本上而不是在原始列表上工作?是的,但请注意“在上工作”的含义。变量
i
从列表
colors
的副本中获取其值。但是,
colors+=[“black”]
行中对
colors
的引用是指原始列表。这正是代码想要的,所以它是有效的


如果是这样,那么[“黑色”]是如何附加到原始颜色列表中的?这是因为进行附加的行是指原始列表,而不是列表的副本。

这是您在提供的:

如果在列表上循环,最好避免在循环体中更改列表。为了给你一个例子,看看会发生什么,请看下面的例子:

“打印颜色”将打印什么

为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示:

我们仍然可以做一些我们不应该做的事情。我们更改了“颜色”列表,但我们的更改对循环没有任何影响。要循环的元素在迭代过程中保持不变

因此:

现在没有副本:

colours = ["red"]
for i in colours:
    if i == "red":
        colours += ["black"] # black gets added, colours -> ["red", "black"]
    if i == "black": # now because of ^^, white gets added.
        colours += ["white"]
print(colours) # -> ['red', 'black', 'white']
现在更糟糕的情况是:

colours = ["red"]
for i in colours:
    if i == "red":
        colours += ["red"] # red gets add, colours = ["red", "red"]
                          # 2nd iteration, red gets added, colours ->  colours = ["red", "red", "red"]
                          # infinite loop....
    if i == "black":
        colours += ["white"]
print(colours) 
您所做的与示例试图展示的完全不同,它试图避免将元素添加到您正在迭代的列表中,因此您只计算原始列表中的元素,而不是新添加的元素。您正在尝试创建一个新列表:

colours = ["red"]
new = colours[:] # assign new list/copy to a name.
for i in colours:
    if i == "red":
        new += ["red"] # add to new list
    if i == "black":
        new += ["white"]
print(colours)
您还应该
附加
而不是
+=

colours = ["red"]
new = colours[:]
for i in colours:
    if i == "red":
        new.append("red")
    if i == "black":
        new.append("white")
print(colours)

这是您在提供的中引用的代码:

如果在列表上循环,最好避免在循环体中更改列表。为了给你一个例子,看看会发生什么,请看下面的例子:

“打印颜色”将打印什么

为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示:

我们仍然可以做一些我们不应该做的事情。我们更改了“颜色”列表,但我们的更改对循环没有任何影响。要循环的元素在迭代过程中保持不变

因此:

现在没有副本:

colours = ["red"]
for i in colours:
    if i == "red":
        colours += ["black"] # black gets added, colours -> ["red", "black"]
    if i == "black": # now because of ^^, white gets added.
        colours += ["white"]
print(colours) # -> ['red', 'black', 'white']
现在更糟糕的情况是:

colours = ["red"]
for i in colours:
    if i == "red":
        colours += ["red"] # red gets add, colours = ["red", "red"]
                          # 2nd iteration, red gets added, colours ->  colours = ["red", "red", "red"]
                          # infinite loop....
    if i == "black":
        colours += ["white"]
print(colours) 
您所做的与示例试图展示的完全不同,它试图避免将元素添加到您正在迭代的列表中,因此您只计算原始列表中的元素,而不是新添加的元素。您正在尝试创建一个新列表:

colours = ["red"]
new = colours[:] # assign new list/copy to a name.
for i in colours:
    if i == "red":
        new += ["red"] # add to new list
    if i == "black":
        new += ["white"]
print(colours)
您还应该
附加
而不是
+=

colours = ["red"]
new = colours[:]
for i in colours:
    if i == "red":
        new.append("red")
    if i == "black":
        new.append("white")
print(colours)


是,但您仍在添加到原始列表中。在循环和附加之前,请创建一个新副本。您应该添加完整的代码,因为它与您尝试执行的操作完全不同。是的,但您仍在添加到原始列表中。在循环并附加到之前,请创建一个新副本。您应该添加完整的代码,因为它与您尝试执行的操作完全不同。使用“附加”可添加到list@PadraicCunningham我只是逐字复制了原始代码,但是是的,已更改。您仍然需要迭代原始列表,以匹配要添加到list@PadraicCunningham我只是一字不差地复制了原始代码,但是是的,更改了。您仍然需要迭代原始列表以匹配代码的意图。因此,如果我编写
colors[:]+=[“black”]
然后它将附加到副本列表中,并且对原始列表没有任何影响?其次,副本可以更改吗?如果您要编写
colors[:]+=[“black”]
,您将附加到一个新副本,而不是您正在迭代的副本。@dlpnrwbie96,不,您需要创建一个新列表,
new=colors[:]
并附加到new@dlpnewbie96:是的,列表的新副本将被更改,但是,由于您没有将结果保存在任何地方,因此更改将丢失并且没有任何价值。更改的副本将不同于在“颜色[:]:”行中创建的副本,它是在同一行中创建、更改和丢失的。所以一份拷贝可以被修改,这有它的优点和缺点。存储
for
行中的副本并用于le