Python 调用函数后,值会意外更改

Python 调用函数后,值会意外更改,python,Python,请告诉我调用此函数后为什么S[f'{colors[0]}]会发生变化,以及如何修复它 S = {"1": list(range(0,5)), "2": list(range(20,25)), "3": list(range(10,15))} colors = [1, 2 ,3] def count_bycolor(colors): countries_bycolor = S[f'{colors[0]}'] for i in range(1, len(colors)):

请告诉我调用此函数后为什么
S[f'{colors[0]}]
会发生变化,以及如何修复它

S = {"1": list(range(0,5)), "2": list(range(20,25)), "3": list(range(10,15))}
colors = [1, 2 ,3]

def count_bycolor(colors):
    countries_bycolor = S[f'{colors[0]}']
    for i in range(1, len(colors)):
        countries_bycolor.extend(S[f'{colors[i]}'])
    return countries_bycolor

count_bycolor(colors)
len(S[f'{colors[0]}'])
count_bycolor(colors)
len(S[f'{colors[0]}'])

谢谢你的帮助,节日快乐

您正在dict中的一个列表上执行操作。这两个对象都是可变对象,并且由于python的存在,会导致更改“原始”对象(它是同一个对象)

这意味着,如果要在不更改原始对象的情况下对这些对象进行操作,则需要删除这些对象的名称

根据您的问题,可以简单地更改一行:

import copy

def count_bycolor(colors):
    countries_bycolor = copy.copy(S[f'{colors[0]}'])
    for i in range(1, len(colors)):
        countries_bycolor.extend(S[f'{colors[i]}'])
    return countries_bycolor

count_bycolor(colors)

>>> [0, 1, 2, 3, 4, 20, 21, 22, 23, 24, 10, 11, 12, 13, 14]

S

>>> {'1': [0, 1, 2, 3, 4], '2': [20, 21, 22, 23, 24], '3': [10, 11, 12, 13, 14]}

您正在dict中的一个列表上执行操作。这两个对象都是可变的对象,并且由于python的存在,会导致更改“原始”对象(它是同一个对象)

这意味着,如果要在不更改原始对象的情况下对这些对象进行操作,则需要删除这些对象的名称

根据您的问题,可以简单地更改一行:

import copy

def count_bycolor(colors):
    countries_bycolor = copy.copy(S[f'{colors[0]}'])
    for i in range(1, len(colors)):
        countries_bycolor.extend(S[f'{colors[i]}'])
    return countries_bycolor

count_bycolor(colors)

>>> [0, 1, 2, 3, 4, 20, 21, 22, 23, 24, 10, 11, 12, 13, 14]

S

>>> {'1': [0, 1, 2, 3, 4], '2': [20, 21, 22, 23, 24], '3': [10, 11, 12, 13, 14]}

它正在更改,因为您在
countries\u bycolor.extend(S[f'{colors[i]}]]
行中更改了它。为了帮助你,你必须提供更多关于你在这里努力实现的细节。您期望的行为是什么?
countries\u bycolor
S
countries\u bycolor=S[f'{colors[0]}]
之后的列表;这不是副本。如果您想独立更改,您需要。清除,谢谢,节日快乐。它正在更改,因为您在
countries\u bycolor.extend(S[f'{colors[i]}]
行中更改了它。为了帮助你,你必须提供更多关于你在这里努力实现的细节。您期望的行为是什么?
countries\u bycolor
S
countries\u bycolor=S[f'{colors[0]}]
之后的列表;这不是副本。如果您想独立更改,则需要。清除、感谢并祝您节日快乐。您只需使用
列表
目录
objectsTrue上提供的
复制
方法即可。这并没有被标记为
3.x
(是的,我知道我们都应该这样做,因为您还有大约一周的
2.7
支持时间),我相信这是一个较新的选项。是的,但是对于通用python标记,通常假定它是python 3。此外,它还可以解释OPs代码中的
列表(范围(…)
。非常正确,但这是一个周五下午,所以思考能力是…:)您只需使用
列表
dict
objectsTrue上提供的
.copy
方法即可。这并没有被标记为
3.x
(是的,我知道我们都应该这样做,因为您还有大约一周的
2.7
支持时间),我相信这是一个较新的选项。是的,但是对于通用python标记,通常假定它是python 3。此外,它还可以解释OPs代码中的
列表(范围(…)
。非常正确,但这是一个周五下午,所以思考能力是…:)