【发布时间】:2022-12-06 04:41:18
【问题描述】:
我最近参加了代码 2022 的第 5 天(剧透对于下面的代码)并且出于某种原因,我传递给 A 部分函数的堆栈列表正在更改原始列表,然后 B 部分失败。A 部分和 B 部分是在单独的 python 文件中完成的( A.py, B.py) 然后我在主文件 (main.py) 中引用它们来清理我的代码。我做了一些研究,但无法弄清楚为什么 Python 会更改原始列表,但我可以说我需要制作一个明确的副本,这是我以前从未做过的,我想知道是否有人能告诉我为什么。我通过将列表转换为元组、传递它然后将其转换回列表来制作显式副本。
现在运行我的代码会出现错误,这是因为 stacks 已更改为 A 部分的最终堆栈,即使它不应该更改。将 stacks = tuple(stacks) 添加到 main.py,然后将 data = list(data) 添加到两个子程序可以修复它,但我想知道为什么它在没有我要求的情况下更改 main.py 的堆栈列表。
任何帮助表示赞赏。只是想了解为什么 python 这样做,以及它是我还是 python 的内置功能。
主要文件:
import A
import B
with open("input.txt", "r") as file:
data = [_ for _ in file.read().split("\n")]
stacks = []
controls = []
stackData = data[:8]
for i in range(9):
stack = ""
for row in stackData:
box = row[(i*4 + 1)]
stack += box
stacks.append(stack)
for i in range(len(stacks)):
stacks[i] = stacks[i].strip()
controlData = data[10:]
for row in controlData:
control = row.split(" ")
amount = int(control[1])
spot = int(control[3])
destination = int(control[5])
controls.append([amount, spot, destination])
print(f"Answer to section A is: {A.calculate(stacks, controls)}")
print(f"Answer to section B is: {B.calculate(stacks, controls)}")
A.py:
def calculate(data, controls):
answer = ""
for control in controls:
amount = control[0]
start = control[1] - 1
destination = control[2] - 1
boxes = data[start][:amount]
boxes = boxes[::-1]
data[start] = data[start][amount:]
data[destination] = boxes + data[destination]
for stack in data:
answer += stack[0]
return answer
B.py:
def calculate(data, controls):
answer = ""
for control in controls:
amount = control[0]
start = control[1] - 1
destination = control[2] - 1
boxes = data[start][:amount]
data[start] = data[start][amount:]
data[destination] = boxes + data[destination]
for stack in data:
answer += stack[0]
return answer
【问题讨论】:
-
当您将参数传递给函数时,该函数接收那个对象- 在没有明确要求的情况下,Python 不会浪费时间或内存来复制对象。所以在你的两个函数中对
data所做的更改随处可见。