このリンクから:参照によって変数を渡すにはどうすればよいですか? 、Python は文字列 (不変の型変数) をパラメーターとして関数に渡すときにコピーしますが、文字列が巨大な場合はメモリを浪費すると思います。多くの場合、関数を使用して文字列の一部の操作をラップする必要があるため、より効果的に行う方法を知りたいですか?
質問する
86054 次
7 に答える
39
Python は、関数に渡されたオブジェクト (文字列を含む) のコピーを作成しません。
>>> def foo(s):
... return id(s)
...
>>> x = 'blah'
>>> id(x) == foo(x)
True
関数内の文字列を「変更」する必要がある場合は、新しい文字列を返し、元の名前に割り当てます。
>>> def bar(s):
... return s + '!'
...
>>> x = 'blah'
>>> x = bar(x)
>>> x
'blah!'
残念ながら、大きな文字列がコピーされるため、大きな文字列に小さな変更を加える場合、これは非常に非効率的です。これに対処する Pythonic の方法は、文字列をリストに保持し、すべての断片を取得したらそれらを結合することです。
于 2012-11-28T15:46:49.930 に答える
5
def modify_string( t ):
the_string = t[0]
# do stuff
modify_string( ["my very long string"] )
于 2012-11-28T16:20:11.087 に答える
5
In [7]: strs="abcd"
In [8]: id(strs)
Out[8]: 164698208
In [9]: def func(x):
print id(x)
x=x.lower() #perform some operation on string object, it returns a new object
print id(x)
...:
In [10]: func(strs)
164698208 # same as strs, i.e it actually passes the same object
164679776 # new object is returned if we perform an operation
# That's why they are called immutable
ただし、文字列に対する操作は常に新しい文字列オブジェクトを返します。
于 2012-11-28T15:48:24.680 に答える
1
他のパラメーターと同じように渡すだけです。内容はコピーされず、参照のみがコピーされます。
于 2012-11-28T15:46:50.990 に答える