我有一个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(...),但这也不起作用)有帮助吗?
答案 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()