【问题标题】:Why is my python file changing my function inputs?为什么我的 python 文件会更改我的函数输入?
【发布时间】: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所做的更改随处可见。

标签: python function var


【解决方案1】:

好问题!因此,您已经怀疑这是 python 的内置功能。 Python 按值传递所有内容。但是,当您传递任何数据结构时,被调用的函数可以更改参数的内容(但不能更改参数本身)。

这是 A.calculate() 中的“违规”行:

    data[start] = data[start][amount:]
    data[destination] = boxes + data[destination]

看起来好像 B.caculate() 也修改了数据的内容:

    data[start] = data[start][amount:]
    data[destination] = boxes + data[destination]

正如您所猜到的,您可以通过将“克隆”列表传递给计算函数来更正此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2013-10-08
    • 2015-10-23
    相关资源
    最近更新 更多