2

助けが必要です-C++ のように ref/by ptr で値をメソッドに送信しようとしていますが、どうすればよいですか?

例:

 def test(x):
    x=3    

 x=2
 test(x)
 print(x)

この場合、xa はテスト メソッドのローカル変数であり、「元の」X を変更しないため、「元の」X を変更するにはどうすればよいですか? ありがとう

4

2 に答える 2

4

いくつかの点で、Python のすべての呼び出しは参照を使用して呼び出されます。実際、すべての変数はある意味で参照です。ただし、例のように、一部のタイプはint変更できません。

たとえば、 a の場合、list探している機能は簡単です。

def change_it(some_list):
    some_list.append("world")

foo = ["hello"]
change_it(foo)
print(foo)  # prints ['hello', 'world']

ただし、パラメーター変数を再割り当てsome_listしても、呼び出しコンテキストの値は変更されないことに注意してください。

ただし、この質問をしている場合は、おそらく 1 つの関数を使用して 2 つまたは 3 つの変数を設定するようなことをしようとしているでしょう。その場合、次のようなものを探しています。

def foo_bar(x, y, z):
    return 2*x, 3*y, 4*z

x = 3
y = 4
z = 5
x, y, z = foo_bar(x, y, z)
print(y)  # prints 12

もちろん、Python では何でもできますが、そうしなければならないという意味ではありません。TV ショーの Mythbusters のように、あなたが探しているものを実現するものがここにあります

import inspect

def foo(bar):
    frame = inspect.currentframe()
    outer = inspect.getouterframes(frame)[1][0]
    outer.f_locals[bar] = 2 * outer.f_locals[bar]

a = 15
foo("a")
print(a) # prints 30

さらに悪いことに:

import inspect
import re

def foo(bar):
    # get the current call stack
    my_stack = inspect.stack()
    # get the outer frame object off of the stack
    outer = my_stack[1][0]
    # get the calling line of code; see the inspect module documentation
    #   only works if the call is not split across multiple lines of code
    calling_line = my_stack[1][4][0]
    # get this function's name
    my_name = my_stack[0][3]
    # do a regular expression search for the function call in traditional form
    #   and extract the name of the first parameter
    m = re.search(my_name + "\s*\(\s*(\w+)\s*\)", calling_line)
    if m:
        # finally, set the variable in the outer context
        outer.f_locals[m.group(1)] = 2 * outer.f_locals[m.group(1)]
    else:
        raise TypeError("Non-traditional function call.  Why don't you just"
                        " give up on pass-by-reference already?")

# now this works like you would expect
a = 15
foo(a)
print(a)

# but then this doesn't work:
baz = foo_bar
baz(a)  #  raises TypeError

# and this *really*, disastrously doesn't work
a, b = 15, 20
foo_bar, baz = str, foo_bar
baz(b) and foo_bar(a)
print(a, b)  # prints 30, 20

お願い、お願いお願い、しないで。ここに記載したのは、読者が Python のよりあいまいな部分を調べるように促すためだけです。

于 2013-10-16T17:02:40.167 に答える