Як отримати порожній масив будь-якого розміру в python?


120

Я в основному хочу, щоб еквівалент цього пітона в C:

int a[x];

але в python я оголошую масив на зразок:

a = []

і проблема в тому, що я хочу призначити випадкові слоти зі значеннями, такими як:

a[4] = 1

але я не можу зробити це з python, оскільки масив порожній.

Відповіді:


239

Якщо під "масивом" ви справді маєте на увазі список Python, ви можете використовувати

a = [0] * 10

або

a = [None] * 10

91
Одне, на що потрібно стежити, a = [obj] * Nце те, що той самий obj з’являється у кожному елементі масиву. Якщо це об'єкт, що змінюється, і ви змінюєте один елемент, все буде змінено. ... Але для цього прикладу з використанням цілих чисел (або будь-якого іншого непорушного типу) це не має значення. Або, якщо ви просто призначите елементи, це теж не проблема. (Я згадую це, тому що я робив саме це занадто часто :))
dappawit

4
Це вкусив мене важко на мій найперший проект Python, @dappawit. Прислухайтеся до цього попередження.
Нейт

це створює те саме посилання на об’єкти
Amr Alaa

22

Ви не можете робити саме те, що ви хочете в Python (якщо я вас правильно прочитав). Вам потрібно ввести значення для кожного елемента списку (або, як ви його назвали, масив).

Але спробуйте це:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Для списків інших типів використовуйте щось, крім 0. Також Noneчасто є хорошим вибором.


2
Ця відповідь межує з неправильною. range(N)вже створить список, якщо Python <3.0.
Апалала

1
Правда, вона складе список. Якщо ви турбуєтесь про ефективність, ви можете використовувати xrange(N)в Python 2.x. Я не впевнений, наскільки це межує з невірним. Я вважаю за краще, a = range(N)тому що кожен елемент починається з розумного "за замовчуванням". Я думаю, це питання думки.
dappawit


7

Просто оголосіть список і додайте кожен елемент. Наприклад:

a = []
a.append('first item')
a.append('second item')

5
Як би ви тоді «призначили випадкові слоти»
Тделанг

5

також ви можете продовжити це методом розширення списку.

a= []
a.extend([None]*10)
a.extend([None]*20)

1

Якщо ви (або інші шукачі цього питання) насправді були зацікавлені у створенні суміжного масиву для заповнення цілими числами, врахуйте bytearray та memoryivew :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
Хоча цей код може вирішити питання, включаючи пояснення, як і чому це вирішує проблему, справді допоможе покращити якість вашої публікації та, ймовірно, призведе до збільшення кількості голосів. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз задає питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Даніїл

0

Якщо ви дійсно хочете масив у стилі С

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Зауважте, що в python відсутня концепція неініціалізованої змінної. Змінна - це ім'я, яке пов'язане зі значенням, тому це значення повинно мати щось. У прикладі вище масив ініціалізується нулями.

Однак у python це нечасто, якщо ви насправді не потрібні для матеріалів низького рівня. У більшості випадків вам краще використовувати порожній список або порожній масивний масив, як підказують інші відповіді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.