質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

3回答

2470閲覧

Python : datetimeのreplace()を使用しても、値が変化しない

Unico417

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2021/08/04 18:04

困っていること

メッセージアプリから、スケジュールを管理するアプリを作っています。

datetimeにある、replace()を使っても、値が変更されません。
エラーコードも出ないので困っています。

なぜ値が変化しないのか、他のさせる手段はあるのか等、
稚拙が故の質問ですが、ご教示お願い致します。

該当のソースコード

Python

1from datetime import datetime 2import re 3 4date = datetime(2000,1,1) 5 6string = '2014-10-03' 7s_string = re.split('-',string) 8print(s_string) 9# >>> ['2014', '10', '03'] 10 11date.replace( year = int(s_string[0]), month = int(s_string[1]), day = int(s_string[2])) 12 13print(date) 14# >>> 2000-01-01 00:00:00

試したこと

  • date.replace(year=2014)など、変数を介さない記述でもダメでした。
  • 以下のように、Exceptionにも頼ってみましたが、エラーコードは出ませんでした。

Python

1try: 2 date.replace(year=2014, month=10, day=03) 3except Exception as e: 4 print(e)

補足情報(FW/ツールのバージョンなど)

  • Google Coraboratory
  • Python 3.9.6

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

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

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

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

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

guest

回答3

0

ご質問の件は、Pythonを使う上で基本的であり、重要なところです。

Pythonでは、変数の値に対する処理を行う処理と変数を(change)する処理は別です。
変数に代入しない限り、変数の値は変更(change)されません。

python

1>>> x = 100 2>>> x + 1 3101 4>>> print(x) 5100 6>>> x = x+ 1 7>>> print(x) 8101

変数の値がミュータブルなコレクションの場合には、値であるコレクションが変化(mutate)させることが可能です。
これは変数の値は変更(change)されないけれども値が変化(mutate)しただけですので混同しないようにしてください。

ミュータブルなコレクションの説明は組み込み型をご覧ください。

コレクションが変化(mutate)するというのは以下のようなことを言います。
この場合、idが変わっていないことは、変数の値が変更(change)されていないことを示しています。

python

1>>> x = [0, 42] 2>>> print(id(x)) 31597530210112 4>>> x[0] = 84 5>>> print(id(x)) 61597530210112 7>>> print(x) 8[84, 42]

idの意味については、id(object)をご覧ください。

datetimeクラスのインスタンスはコレクションではないのでミュータブルではありません。
従って変数dateを変更(change)したければ新しい値を変数dateに代入しなければなりません。

追記

一般的な言葉で説明すると以下のようになります。

「靴かえたの?」
「テレワークだからヒール止めてスニーカーにしたんだ」
という場合、靴という名前(変数名)が指しているもの(オブジェクト)がヒールからスニーカーも変わっています。
これが変数の代入、つまり値の変更(change)です。

「エコバッグ、大きいね」
「買い物が多かったから詰め込んだの」
という場合、エコバッグという名前(変数名)が指しているもの(オブジェクト)は昨日と同じであり、荷物を詰め込んだせいで見映えが違っているだけです。
これが、変数の値であるミュータブルなコレクションの変化(mutate)です。

投稿2021/08/04 22:30

編集2021/08/04 23:56
ppaul

総合スコア24670

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

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

Unico417

2021/08/05 05:09

詳しい説明ありがとうございました! すごく丁寧な説明、助かりました!
guest

0

すでに回答がついているので屋上屋ですが、ちょっと別の観点からの説明も加えてみます。

オブジェクトのメソッドには、インプレースなメソッドと、インプレースでないメソッドの違いがあります。

インプレースなメソッドは、そのオブジェクトのデータを in place に(=その場で)変更します。オブジェクトのデータは、メソッドの演算結果で置き換えられます。

たとえばリストオブジェクトの sort メソッドは、リストをインプレースに変更します (そして None を返します)。

python

1>>> l = [3, 5, 2, 4, 1] 2>>> l.sort() 3>>> l 4[1, 2, 3, 4, 5]

インプレースでないメソッドは、そのオブジェクトのデータには手を加えずに、演算結果を新たなオブジェクトとして生成して、返します。元のオブジェクトは変更されません。
たとえば文字列オブジェクトの replace メソッドは、元の文字列のコピーを新たなオブジェクトとして生成し、部分文字列を置換した上で返します。

python

1>>> s = "some string" 2>>> s.replace("s", "c") 3'come ctring' 4>>> s 5'some string'

datetime オブジェクトの replace メソッドは、文字列オブジェクトの replace メソッドと同様に、インプレースでないメソッドです。公式ドキュメントでは、「キーワード引数で指定した属性の値を除き、同じ属性をもつ datetime オブジェクトを返します」と説明されています。演算結果は新たなオブジェクトとして返されますが、元のオブジェクトは変更されません。

投稿2021/08/05 03:43

etherbeg

総合スコア1195

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

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

Unico417

2021/08/05 05:12

ありがとうございます。 すごく勉強になりました! インプレースである/ないメソッドというのを知らなかったので、存在を知ることでまた一つ知識が増えました!
guest

0

ベストアンサー

変更した結果は戻り値で受け取る必要があるようです。

Python

1date = date.replace( year = int(s_string[0]), month = int(s_string[1]), day = int(s_string[2]))

投稿2021/08/04 18:30

javahack

総合スコア1088

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

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

Unico417

2021/08/05 05:08

ありがとうございます! シンプルにこれでした...見落としてました...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問