tomato15
@tomato15 (tomato15)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonのtupleの初期化

Q&A

Closed

解決したいこと

戻り値がタプルの関数の結果を受け取る変数を初期化する良い方法を知りたい。

実際にあったこと

戻り値がタプルの関数の結果を受け取る変数がリストで初期化されていた。例は以下。

hoge = [0]
hoge = return_tuple(x, y)
type(hoge)
> tuple

リストで初期化されていたのに、その後で入れられる型はタプルで紛らわしいと思った。
ただ、タプルは後から変更できないのでhoge = ()とも書けないしどうすれば良いかわからなくなった。

そもそものご指摘でも構いませんので回答お願いいたします!

0

5Answer

提示していらっしゃるサンプルコードだと、直接代入すると言いますか、そもそも初期化が必要ないと思うのですが。。。

2Like

Comments

  1. @tomato15

    Questioner

    初期化不要ではとなりますよね。。サンプルありがとうございます。

そもそも、何のために初期化するのでしょうか?

hoge = ()
hoge = (0,)
hoge = tuple()

タプルは後から変更できないのでhoge = ()とも書けないし

タプル内の要素の更新はできませんが、同じ変数への再代入はできますよね。

2Like

Comments

  1. @tomato15

    Questioner

    正直なぜ初期化してあったのかわかりませんでした。。確かに再代入はできますね。

他の方が仰ってるよう提示されてるコードでは初期化が不要です。
どうしても明確的な初期化がしたいであればhoge = tuple()とかhoge = Noneなど(使うなら無駄なことをしてる事を自覚しておいた方が良いでしょう)。

リストで初期化されていたのに、その後で入れられる型はタプルで紛らわしいと思った。

であれば、変数名や型ヒントを使って工夫したら良いのです。

たとえば提示されてるコードなら変数名を名前_型名に置き換え、さらに初期化の際に1度だけ型ヒントを付け加えます。

hoge_tuple: tuple = return_tuple(x, y)

型ヒント自体Pythonからほぼ警告はありませんが、IDEなど使っていれば警告を受けられると思います。

以上のように工夫するだけで随分紛らわしさは無くなるかと思います。

もう少し詳しいことが知りたいのであれば「Python PEP8」でググると良いでしょう。

2Like

Comments

  1. @tomato15

    Questioner

    ありがとうございます。型ヒントは良い手法ですね。

Pythonの代入はオブジェクトに対する名前付けなので、この場合『[0]についていたhogeという名前を外してreturn_tupleの返り値につけ直した』というイメージになります。

なのでこの初期化にはほとんど意味がありません。
しかし次のように『return_tupleの代入を行わないかもしれない』ような場合には有効でしょう。
型が変わると困るかもしれないのでlistに変換するかはケースバイケースです。(tupleでもlistでも読み取るだけなら変わらない場合が多いため)

hoge = [0]
if any_bool_value:
  hoge = list(return_tuple())
require_list_func(hoge)

また、次のように書くことで『listの一部を更新』することができます。

a = [1,2,3]
b = [4,5]
a[1:3] = b
print(a) # [1,4,5]

この場合bがtupleでも問題なく展開されてaの要素を更新するのでそういった使い方をするために初期化的な定義をすることもあるかもしれません。

2Like

Comments

  1. @tomato15

    Questioner

    リストが必要な場合についても検討いただきありがとうございます。

hoge  = (1,2,3)
hoge += (4,5,6)
hoge += (7,8,9)
hoge  = tuple(sorted(hoge, reverse=True))
print(hoge, type(hoge))

tuple型は要素の書き替えはできないのですが、一見出来ていると勘違いします。

1Like

Comments

  1. @tomato15

    Questioner

    書き換えはできないが、追加はできるということでしょうか。ありがとうございます。

Your answer might help someone💌