পাইথনে ২D লিস্ট (ম্যাট্রিক্স) তৈরি করার সময় একটি সাধারণ ভুল হয়: [[0]*cols]*rows। এটি সকল রোকে একই লিস্ট অবজেক্টের রেফারেন্স बनाয়, ফলে একটি রো পরিবর্তন করলে সব রো বদলায়। সঠিক পদ্ধতি নিচে দেওয়া হলো।
ভুল পদ্ধতি (শ্যালো কপি সমস্যা)
rows, cols = (5, 5)
arr = [[0]*cols]*rows # ভুল! সব রো একই অবজেক্ট
arr[0][0] = 1
for row in arr:
print(row)
# আউটপুট:
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0]
# [1, 0, 0, 0, 0] ← সব রোই বদলায়!
সঠিক পদ্ধতি: লিস্ট কাম্প্রিহেনশন (ডিপ কপি)
rows, cols = (5, 5)
arr = [[0 for i in range(cols)] for j in range(rows)] # সঠিক!
arr[0][0] = 1
for row in arr:
print(row)
# আউটপুট:
# [1, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0] ← শুধু প্রথম রো বদলল
অন্যান্য সঠিক পদ্ধতিগুলো
NumPy ব্যবহার করে (সাংখ্যিক কাজের জন্য সেরা)
import numpy as np arr = np.zeros((rows, cols), dtype=int) arr[0][0] = 1 print(arr) # [[1 0 0 0 0] # [0 0 0 0 0] # [0 0 0 0 0] # [0 0 0 0 0] # [0 0 0 0 0]]
copy.deepcopy ব্যবহার করে
import copy row = [0]*cols arr = [copy.deepcopy(row) for _ in range(rows)]
itertools.repeat ব্যবহার করে (একটু আধুনিক)
from itertools import repeat arr = [list(repeat(0, cols)) for _ in range(rows)]
কেন সমস্যা হয়? (ভিজ্যুয়াল ব্যাখ্যা)
# ভুল পদ্ধতিতে: # arr = [row, row, row, row, row] # ৫টি আলাদা রো নয়, একই রোর ৫টি রেফারেন্স # সঠিক পদ্ধতিতে: # arr = [row1, row2, row3, row4, row5] # ৫টি সম্পূর্ণ স্বতন্ত্র রো
সুপারিশ
- সাধারণ লিস্ট:
[[0]*cols for _ in range(rows)]বা[[0 for _ in range(cols)] for _ in range(rows)] - সাংখ্যিক কম্পিউটিং: NumPy
np.zeros((rows, cols))— দ্রুত, মেমরি-দক্ষ এবং গাণিতিক অপারেশন সাপোর্ট করে। - মিউটেবল ডিফল্ট ভ্যালু: ফাংশন আর্গুমেন্টে
matrix=Noneদিয়ে ভিতরে ইнициালাইজ করুন।