如何更改分配给传递给函数的数组的赋值?

时间:2019-04-20 01:02:11

标签: python

我有一个5x2维数组,我想为其分配特定的值,但是即使查看Python对按值而不是引用传递的多种解释,我也很难做到。相关代码如下:

def do_something(x, y):
    x = 0
    y = 0
    return_value = -1 #error may occur in this code
    #some complex operation is performed that manipulates x and y
    return_value = 0
    return return_value

def main():
    result = [[0]*5]*2
    for i in range(5):
         do_something(result[i][0], result[i][1])

我显然不能说result = do_something(...),因为我仍然想知道do_something返回了什么,以查看复杂的操作是否正确完成。 Append不能完全解决我的问题,因为x和y在代码内进行了操作。如果我知道要追加的内容,则Result [i] .append(...)将起作用。但是即使复杂的操作正确进行,数组也不会改变。 (我尝试过传递结果,然后尝试r.append(...),但这也不起作用)有帮助吗?

3 个答案:

答案 0 :(得分:0)

batch_writer()函数没有问题。

do_something函数中,

main = result

因此,请更改以下代码。
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

答案 1 :(得分:0)

Python确实通过引用传递参数。但是,有两点要考虑:

首先,当传递不可变类型(如整数,浮点数,字符串等)时,它们将不受函数中运行的代码的影响。

        std::vector<int> inorderslice = std::vector<int>(inorder.begin(), inorder.begin() + index);

第二,当您在函数范围内将变量的值重新分配给新变量时,原始变量不会生效。

x = 1.0
def int_do_somthing(x):
    x += 1
int_do_somthing(x)
print(x) # 1.0

因此,在您的情况下,将数组切片而不是单个值传递给函数,并且不要重新分配整个切片,而是编辑它们包含的值(使用[]运算符访问)。

答案 2 :(得分:0)

result[i][0]result[i][1]是整数类型值。由于integer是原始类型,因此在函数内部更改其值不会影响列表外部的实际值。您应该传递列表,因为它不是原始类型,因此您在函数内部进行的任何更改也会影响函数外部的列表。 另外,您可能不想使用result = [[0]*5]*2初始化数组。原因之一是它将初始化2x5数组而不是5x2。另一个更重要的原因是,它将仅重复引用列表[0, 0, 0, 0, 0]两次。因此,如果在一行中仅更改1个值,则另一行也将具有该值。例如:

result = [[0] * 5] * 2
print(result) # This will print out [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
result[0][1] = 1
print(result) # This will print out [[0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]

您可以使用的另一种方法是使用result = [[0 for x in range(5)] for y in range(2)],它将为数组提供所需的值,但它们不是像上面一样的重复引用。

result = [[0 for x in range(5)] for y in range(2)]
print(result) # This will print out [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
result[0][1] = 1
print(result) # This will print out [[0, 1, 0, 0, 0], [0, 0, 0, 0, 0]]

我已根据我的建议修改了您的代码,它似乎运行良好:

def do_something(arr):
    # Assign value below
    arr[0] = 1
    arr[1] = 2

def main():
    result = [[0 for x in range(2)] for y in range(5)]
    for i in range(5):
         do_something(result[i])
    print result

main()