[解決済み】なぜ関数は、呼び出し元が認識するいくつかの引数を変更でき、他の引数を変更できないのですか?
2022-04-06 01:27:50
質問
Pythonの変数スコープに対する考え方を理解しようとしています。この例では、なぜ
f()
の値を変更することができます。
x
の中で認識される。
main()
の値ではありません。
n
?
def f(n, x):
n = 2
x.append(4)
print('In f():', n, x)
def main():
n = 1
x = [0,1,2,3]
print('Before:', n, x)
f(n, x)
print('After: ', n, x)
main()
出力します。
Before: 1 [0, 1, 2, 3]
In f(): 2 [0, 1, 2, 3, 4]
After: 1 [0, 1, 2, 3, 4]
解決方法は?
いくつかの回答には、関数呼び出しの文脈で "コピー" という単語が含まれています。紛らわしいと思うのですが。
Pythonはコピーしない オブジェクト 関数呼び出しの際に渡す これまで .
関数のパラメータは 名前 . 関数を呼び出すと、Pythonはこれらのパラメータを(呼び出し元のスコープで名前を使って)渡したオブジェクトに結びつけます。
オブジェクトにはミュータブルなもの(リストのような)とイミュータブルなもの(Pythonの整数や文字列のような)があります。Mutableなオブジェクトは変更することができます。名前を変更することはできませんが、別のオブジェクトにバインドすることはできます。
あなたの例では スコープまたは名前空間 についてです。 ネーミングとバインディング と オブジェクトの変更可能性 をPythonで作成しました。
def f(n, x): # these `n`, `x` have nothing to do with `n` and `x` from main()
n = 2 # put `n` label on `2` balloon
x.append(4) # call `append` method of whatever object `x` is referring to.
print('In f():', n, x)
x = [] # put `x` label on `[]` ballon
# x = [] has no effect on the original list that is passed into the function
このページには、素敵な写真があります。 他の言語での変数とPythonでの名前の違いについて .
関連
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] バイトを文字列に変換する
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] 億の相対的輸入
-
[解決済み] mixinとは何か、なぜ有用なのか?
-
[解決済み] 2次元アレイにおけるピーク検出
-
[解決済み] なぜ __init__() は常に __new__() の後に呼び出されるのですか?
-
[解決済み】__get__と__set__とPythonディスクリプタの理解
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
opencvとpillowを用いた顔認証システム(デモあり)
-
任意波形を生成してtxtで保存するためのPython実装
-
Python LeNetネットワークの説明とpytorchでの実装
-
Python Pillow Image.save jpg画像圧縮問題
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】なぜ「LinAlgError: Grangercausalitytestsから「Singular matrix」と表示されるのはなぜですか?
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。