auの日記

プログラミング初心者の日記。(auはハンドルネームです)

リストの中身を倍にして、毎回同じ値を返すようにする

auです。

今日は、久しぶりにPythonに触れてみました。twice変数がいくつ呼び出されても、毎回2倍になるようにするのが目標です。

def twice (n):
  for i in range(0, len(n)):
    n[i] *= 2
  return n


num = [3, 4, 6]
print(twice(num))

print(twice(num))

# 実行結果
[6, 8, 12]
[12, 16, 24]

うーん、これだと1度2倍になって、もう一度呼び出した時に値が保持されたままで、自分の思っているような結果が返ってこない…

そこで、変数tmpを用意して、そこにnumの値を代入しようと考えました。

def twice (n):
  tmp = n
  for i in range(0, len(n)):
    tmp[i] *= 2
  return tmp


num = [3, 4, 6]
print(twice(num))

print(twice(num))

# 実行結果
[6, 8, 12]
[12, 16, 24]

だめやんけ…

どうやらPythonだと、代入した変数の値を変更した際に、元の変数の値も書き換わってしまうようです。

C言語ならreturnで返した際に、その関数の変数がなくなるこんなことないのになぁ

対策

結局色々調べた結果、copyモジュールのcopy関数を使うのがいいのかなと思いました。

import copy

def twice (n):
  tmp = copy.copy(n)
  for i in range(0, len(tmp)):
    tmp[i] *= 2
  return tmp


num = [3, 4, 6]
print(twice(num))

print(twice(num))

# 実行結果
[6, 8, 12]
[6, 8, 12]

ついに理想の値が返ってきました!