🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

971閲覧

Python3: 変数bに別の変数aを代入したとき、aの変化にbを追従させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/20 06:15

変数aにイミュータブルな値を代入し、aを含む式を変数bに代入したとします。
その後aに別の値を代入しても、bの値はそのままになってしまいます。

python3

1>>> a = 1 2>>> b = a 3>>> a = 2 4>>> print(a,b) 52 1

bを関数にすればaの値をbに反映できます。

python3

1>>> def b(arg = a): 2... return arg 3>>> a = 1 4>>> print(b()) 51 6>>> a = 2 7>>> print(b()) 82

ここで質問なのですが、bを関数b()の形ではなく変数のような形bで書いたうえで、aの値を毎回反映させることはできますか?
つまり下のような感じです。

python3

1>>> a = 1 2>>> #何かbについての定義 3>>> print(b) 41 5>>> a = 2 6>>> print(b) 72

これができると今書いているコードが綺麗に整理できて嬉しいです。
関数の形だと毎回()を書く必要があり結構面倒に感じてしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2019/10/20 07:32

なんで"bという名前を付けたい"んですか? "aを変えたら常にbも変わる"なら、"bという名前を付ける意味がまったくない"というのが素直な感覚だと思いましたが。
退会済みユーザー

退会済みユーザー

2019/10/20 09:55

文中の例は質問用に簡略化した状況で、実際上はbはaそのものではなくaの値によって一意に計算できる値を持たせることを想定していました。(質問文1行目の「aを含む式」はその気分で書きました。) b = aとする場合で可能ならそれより複雑な状況でも同様のはず、と考えてこの形で投稿した次第です。確かに質問を普通に読めばご指摘の通りでした。 要は「関数の括弧を書くのが面倒なので、書かなくて済んでる風にできないか」というのが質問意図です。
guest

回答1

0

ベストアンサー

恐らく、できません。

◯ 理由

まず第一に、Python の変数はオブジェクトを指し示しているだけです。
これは既に質問文に挙動を示されているので、ご存知の通りです。

また第二に、変数の代入に関わるフックがありません。
属性の代入に関わるフックはあるのですが...

__getattr__, __setattr__ などが該当するかなと思います。

◯ 代替案

リストや辞書の要素、あるいはクラスの属性として持たせることです。
これはこれで面倒で、質問の意図から反してしまっていますが。

python

1list_a = [0] 2list_b = list_a 3 4list_b[0] = 1 5list_a[0] == 1 # True

python

1dict_a = {0: 0} 2dict_b = dict_a 3 4dict_b[0] = 1 5dict_a[0] == 1 # True

python

1class Class: pass 2 3object_0 = Class() 4object_1 = object_0 5 6object_1.attribute = 1 7object_0.attribute == 1 # True

変数に代入してもオブジェクトは変化しませんが、
属性に代入するとオブジェクトは変化するというのがポイントです。

状態を持たせるために関数の引数の初期値に値を持たせるとか
いままで思いつきませんでした笑

python

1>>> def b(arg = a): 2... return arg 3>>> a = 1 4>>> print(b()) 51 6>>> a = 2 7>>> print(b()) 82 9>>>

投稿2019/10/20 06:35

編集2019/10/20 10:14
nico25

総合スコア830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/21 04:45 編集

ありがとうございます。代替案の、クラスの属性を用いることにしました。 紹介頂いたページも参考になりました。
nico25

2019/10/21 08:51

そう言っていただけると助かります :)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問